package yu.com.time

import yu.com.time.calclator.LocalDateTimeCalculator
import yu.com.time.unit.DateTimeUnit
import java.sql.Timestamp
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime


/**
 * 转换到普通Timestamp(Date子类)
 */
fun LocalDateTime.toTimestamp(): Timestamp = java.sql.Timestamp.valueOf(this)


/**
 * 设置日期部分
 * @param date 要设置的日期部分
 */
fun LocalDateTime.withDate(date: LocalDate) = this.toLocalTime().atDate(date)

/**
 * 设置时间部分
 * @param time 要设置的时间部分
 */
fun LocalDateTime.withTime(time: LocalTime) = this.toLocalDate().atTime(time)

/**
 * 设置时间部分
 * @param year 设置小时部分,默认置为0，如果填写null则不改变
 * @param month 设置分钟部分,默认置为1，如果填写null则不改变
 * @param day 设置秒部分,默认置为1，如果填写null则不改变
 */
fun LocalDateTime.withDate(year: Int? = 0, month: Int? = 1, day: Int? = 1): LocalDateTime {
    val date = LocalDate.of(year ?: this.year, month ?: this.dayOfMonth, day ?: this.dayOfMonth)
    return withDate(date)
}

/**
 * 设置时间部分
 * @param hour 设置小时部分,默认置为0，如果填写null则不改变
 * @param minute 设置分钟部分,默认置为0，如果填写null则不改变
 * @param second 设置秒部分,默认置为0，如果填写null则不改变
 * @param nano 设置纳秒部分,默认置为0，如果填写null则不改变
 */
fun LocalDateTime.withTime(hour: Int? = 0, minute: Int? = 0, second: Int? = 0, nano: Int? = 0): LocalDateTime {
    val time = LocalTime.of(hour ?: this.hour, minute ?: this.minute, second ?: this.second, nano ?: this.nano)
    return withTime(time)
}

/**年份计算*/
val LocalDateTime.cYear get() = LocalDateTimeCalculator(this, DateTimeUnit.YEAR)

/**月份计算*/
val LocalDateTime.cMonth get() = LocalDateTimeCalculator(this, DateTimeUnit.MONTH)

/**星期计算*/
val LocalDateTime.cWeek get() = LocalDateTimeCalculator(this, DateTimeUnit.WEEK)

/**天数计算*/
val LocalDateTime.cDay get() = LocalDateTimeCalculator(this, DateTimeUnit.DAY)

/**小时计算*/
val LocalDateTime.cHour get() = LocalDateTimeCalculator(this, DateTimeUnit.HOUR)

/**分钟计算*/
val LocalDateTime.cMinute get() = LocalDateTimeCalculator(this, DateTimeUnit.MINUTE)

/**秒钟计算*/
val LocalDateTime.cSecond get() = LocalDateTimeCalculator(this, DateTimeUnit.SECOND)

/**毫秒计算*/
val LocalDateTime.cMilli get() = LocalDateTimeCalculator(this, DateTimeUnit.MILLI)

/**纳秒计算*/
val LocalDateTime.cNano get() = LocalDateTimeCalculator(this, DateTimeUnit.NANO)